package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Slf4j
@Component
@Aspect
public class MyJoinPoint {
    // 1.使用注解抽取切入点表达式
    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void pt() {}

    // 环绕通知
    @Around("pt()")
    public Object Around(ProceedingJoinPoint pjp) throws Throwable {
        // ProceedingJoinPoint pjp: 正在处理的连接点(切入点/要增强的方法)
        // 获取目标对象的类名
        String targetClassName = pjp.getTarget().getClass().getName();
        log.info("targetClassName: {}", targetClassName);

        // 获取目标方法/要增强的方法签名
        Signature signature = pjp.getSignature();
        log.info("signature: {}", signature);
        // 获取目标方法名
        log.info("getName: {}", signature.getName());

        // 获取目标方法的参数
        Object[] args = pjp.getArgs();
        log.info("args: {}", Arrays.toString(args));

        // 执行目标方法/要增强的方法
        Object ret = pjp.proceed();
        return ret;
    }
}
